Projekt Pronal Projekt Pronal

Kazalo:
Sofinasiranje projekta
Starejši - učbenik...
Starejši - zbirka nalog...
Tekmovanja...
Tekmovanja - dopolni...
Tekmovanja - popravi...
Tekmovanja - Parsons
rtk 1988
rtk 1996
rtk 1998
rtk 1999
rtk 2000
rtk 2001
rtk 2002
rtk 2004
rtk 2006
rtk 2007
rtk 2008
rtk 2009
rtk 2014
rtk 2016
rtk 2017
rtk 2018
rtk 1999

rtk 1999


1999.1.2 (preuredi)

1. podnaloga

Iz vesolja pričakuješ signal nezemeljske civilizacije. Utemeljeno lahko pričakuješ, da bo sporočilo poslano v jeziku, ki uporablja angleško abecedo 26 malih črk in zadošča naslednjim pravilom:

  • Sporočilo je sestavljeno zgolj iz zaporedja znakov a, b, c, d, . . . , z, ki sestavljajo besede, in iz presledkov med njimi (brez ločil).
  • Zaporedni znaki se vselej razlikujejo (ni podvojenih znakov).
  • Samoglasniki a, e, i, o, u se ne smejo stikati.
  • Znak x je lahko le na koncu besede.

Naloga

Preuredi vrstice funkcije pravo(niz) tako, da bo ugotovila, ali sporočilo ustreza tem pogojem.

if znak not in dovoljeni_znaki:
prejsnji_znak = znak
return False
def pravo(niz):
return False
return False
return True
dovoljeni_znaki = 'abcdefghijklmnopqrstuvwxyz '
for znak in niz:
if znak == prejsnji_znak:
prejsnji_znak = ''
samoglasniki = ['a','e','i','o','u']
if znak in samoglasniki and prejsnji_znak in samoglasniki:
return False
if prejsnji_znak == 'x' and znak != ' ':

Vhodni podatki

Sporočilo v obliki niza.

Izhodni podatki

True, če niz ustreza vsem pravilom in False sicer.

Primer

>>> pravo('we live in same universe')
`True`

>>> pravo('can you hear us')
`False`

Uradna rešitev

def pravo(niz):
    '''Vrne True, če besedilo v niz ustreza vseh pogojem in False sicer.'''

    dovoljeni_znaki = 'abcdefghijklmnopqrstuvwxyz '
    samoglasniki = ['a','e','i','o','u']
    prejsnji_znak = ''
    for znak in niz:
        if znak not in dovoljeni_znaki:
            return False    # nedovoljen znak
        if znak == prejsnji_znak:
            return False    # podvojen znak
        if znak in samoglasniki and prejsnji_znak in samoglasniki:
            return False    # zaporedna samoglasnika
        if prejsnji_znak == 'x' and znak != ' ':
            return False    # x ni na koncu besede
        prejsnji_znak = znak
    return True

1999.1.3 (preuredi)

1. podnaloga

V besedilu iščemo besede, ki vsebujejo vsaj eno zvezdico ($*$). Izpišemo vsako besedo z zvezdico, poleg nje pa tudi njej sledečo besedo, ne glede na to, ali tudi sama vsebuje zvezdico ali ne.

Naloga

Preuredi vrstice funkcije besede(niz), ki bo izvedla opisano opravilo.

vsebuje_zvezdico = True
novo_besedilo = []
else:
def besede(niz):
if '*' in beseda:
return ' '.join(novo_besedilo)
if vsebuje_zvezdico == True and '*' not in beseda:
vsebuje_zvezdico = False
vsebuje_zvezdico = False
novo_besedilo.append(beseda)
vse_besede = niz.split(' ')
for beseda in vse_besede:
novo_besedilo.append(beseda)

Vhodni podatki

Besedilo v obliki niza.

Izhodni podatki

Niz ustreznih besed, ločenih s presledki.

Primer

>>> besede('Dan*es je lepo vre*m*e.')
'Dan*es je vre*m*e.'

>>> besede('Ka*j s*i jedel da*nes?')
'Kaj si jedel danes?'

Uradna rešitev

def besede(niz):
    '''Izpiše besede v katerih je vsaj ena zvezdica (*) in njihove naslednike'''

    vse_besede = niz.split(' ')
    vsebuje_zvezdico = False
    novo_besedilo = []
    for beseda in vse_besede:
        if vsebuje_zvezdico == True and '*' not in beseda:
            novo_besedilo.append(beseda)
        if '*' in beseda:
            vsebuje_zvezdico = True
            novo_besedilo.append(beseda)
        else:
            vsebuje_zvezdico = False
    return ' '.join(novo_besedilo)

1999.1.4 (preuredi)

1. podnaloga

V državi Utopiji so ugotovili, da denar kvari ljudi, zato vsako leto izvedejo prerazporeditev bogastva. Vsako leto določijo, kolikšno je največje sprejemljivo premoženje. Za vsakega državljana popišejo, koliko premoženja ima; tistim, katerih premoženje presega največji dovoljeni znesek, vzamejo toliko, da mu ostane le še ta največji dovoljeni znesek. Največje sprejemljivo premoženje je določeno kot 150% povprečnega premoženja. Tako dobljeni denar razdelijo med najrevnejše državljane in to tako, da ima na koncu čim večje število najrevnejših državljanov enako in čim večje premoženje. Pri tem se vrstni red prebivalcev po bogastvu ne sme spremeniti: če je imel A prej vsaj toliko kot B, ima tudi po prerazporeditvi vsaj toliko kot B.

Naloga

Napisan je program, ki ustreza zgornjemu opisu, vendar ima pomešane vrstice. Preuredi jih tako, da bo program deloval.

        drzavljan = seznam[i]
            vsota += seznam[prejemniki]
        for k in range(prejemniki):
    stevilo_drzavljanov = len(seznam)
            bogastvo += drzavljan - najvecje_bogastvo
def bogastvo(seznam):
    prejemniki = 0  # število prejemnikov
    if prejemniki > 0:
    povprecje = int(sum(seznam) / stevilo_drzavljanov)
            seznam[i] = najvecje_bogastvo
        else:
    return seznam
    najvecje_bogastvo = int(povprecje * 1.5)
            zmanjka_bogastva = True
            seznam[k] = novo_bogastvo
        if drzavljan > najvecje_bogastvo:
    bogastvo = 0
    while prejemniki + 1 < stevilo_drzavljanov and not zmanjka_bogastva:
        novo_bogastvo = int((vsota + bogastvo) / prejemniki)
            prejemniki += 1
    vsota = 0    # vsota prvotnih premoženj prejemnikov bogastva
        if vsota + bogastvo <= seznam[prejemniki] * prejemniki:
    zmanjka_bogastva = False
    for i in range(stevilo_drzavljanov):

Vhodni podatki

Seznam po velikosti urejenih celih števil, kjer vsako število predstavlja bogastvo nekega državljana.

Omejitve vhodnih podatkov
  • $1 \leq n \leq 10^6$
    $n$ = število državljanov

Izhodni podatki

Seznam po velikosti urejenih celih števil, ki predstavljajo novo bogastvo.

Primer

Vhod
>>>>[30,50,120,240,260]
Izhod
[80, 80, 120, 210, 210]

Uradna rešitev

def bogastvo(seznam):
    '''Enakomerno razporedi bogastvo med državljane.'''

    stevilo_drzavljanov = len(seznam)
    povprecje = int(sum(seznam) / stevilo_drzavljanov)

    najvecje_bogastvo = int(povprecje * 1.5)

    # odvzamemo bogastvo tistim, ki so presegajo 150% povprečja
    bogastvo = 0
    for i in range(stevilo_drzavljanov):
        drzavljan = seznam[i]
        if drzavljan > najvecje_bogastvo:
            bogastvo += drzavljan - najvecje_bogastvo
            seznam[i] = najvecje_bogastvo

    # določimo število prejemnikov
    prejemniki = 0  # število prejemnikov
    vsota = 0    # vsota prvotnih premoženj prejemnikov bogastva
    zmanjka_bogastva = False
    while prejemniki + 1 < stevilo_drzavljanov and not zmanjka_bogastva:
        # preverimo, če je bogastva dovolj, da ga razdelimo med vse ljudi pred
        # državljanom seznam[prejemniki]
        if vsota + bogastvo <= seznam[prejemniki] * prejemniki:
            zmanjka_bogastva = True
        else:
            vsota += seznam[prejemniki]
            prejemniki += 1

    # razdelimo bogastvo revnim
    if prejemniki > 0:
        novo_bogastvo = int((vsota + bogastvo) / prejemniki)

        for k in range(prejemniki):
            seznam[k] = novo_bogastvo
    return seznam
Mesto objave ob koncu projekta 15.9.2018